package com.gzz.socket.aio.time;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.util.concurrent.CountDownLatch;

public class AsyncTimeServerHandler implements Runnable {
    int port;
    public CountDownLatch latch;
    public AsynchronousServerSocketChannel asynchronousServerSocketChannel;

    public AsyncTimeServerHandler(int port) {
        this.port = port;
        try {
            // 创建一个异步的服务端通道。 然后绑定监听端口。
            // 如果端口没有被占用，则绑定成功。打印启动成功提示到控制台
            asynchronousServerSocketChannel = AsynchronousServerSocketChannel.open();
            asynchronousServerSocketChannel.bind(new InetSocketAddress(this.port));
        }catch (IOException e){
            e.printStackTrace();
        }

    }

    /**
     * 在线程的run方法中。初始化CountDownLatch对象
     * 它的作用是在完成一组正在执行的操作之前，允许当前的线程一直阻塞。
     * 让线程在此阻塞，防止服务端执行完成退出
     * 在实际项目应用中， 不需要启动独立的线程来处理 AsynchronousServerSocketChannel，
     */
    @Override
    public void run() {
        latch = new CountDownLatch(1);
        try {
            latch.await();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    /**
     * 接受客户端连接
     * 由于异步操作。可以传递一个CompletionHandler<AsynchronousSocketChannel, ? super A> 类型的handler实例接收accept操作成功的通知信息
     */
    private  void doAccept(){
        asynchronousServerSocketChannel.accept(this, new ServerAcceptCompletionHandler());
    }
}
